package main

//
//import (
//	"context"
//	"fmt"
//	"log"
//	"sync"
//	"time"
//)
//
//// MessageRegistrationChecker 消息注册检查器
//type MessageRegistrationChecker struct {
//	// 配置参数
//	initialInterval time.Duration // 初始检查间隔：10秒
//	minInterval     time.Duration // 最小检查间隔：2秒
//	maxInterval     time.Duration // 最大检查间隔：1天
//
//	// 当前状态
//	currentInterval time.Duration // 当前检查间隔
//	isRunning       bool          // 是否正在运行
//	stopCh          chan struct{} // 停止信号
//	mutex           sync.RWMutex  // 读写锁
//
//	// 回调函数
//	checkRegistrationFunc func() bool // 检查注册状态的函数
//	registrationFunc      func() bool // 消息注册函数 MessInitReg01
//}
//
//// NewMessageRegistrationChecker 创建新的消息注册检查器
//func NewMessageRegistrationChecker(
//	checkRegistrationFunc func() bool,
//	registrationFunc func() bool,
//) *MessageRegistrationChecker {
//	return &MessageRegistrationChecker{
//		initialInterval:       10 * time.Second,
//		minInterval:           2 * time.Second,
//		maxInterval:           24 * time.Hour,
//		currentInterval:       10 * time.Second,
//		stopCh:                make(chan struct{}),
//		checkRegistrationFunc: checkRegistrationFunc,
//		registrationFunc:      registrationFunc,
//	}
//}
//
//// Start 启动消息注册检查
//func (c *MessageRegistrationChecker) Start(ctx context.Context) {
//	c.mutex.Lock()
//	if c.isRunning {
//		c.mutex.Unlock()
//		log.Println("消息注册检查器已在运行中")
//		return
//	}
//	c.isRunning = true
//	c.mutex.Unlock()
//
//	log.Println("启动消息注册检查器")
//	go c.run(ctx)
//}
//
//// Stop 停止消息注册检查
//func (c *MessageRegistrationChecker) Stop() {
//	c.mutex.Lock()
//	defer c.mutex.Unlock()
//
//	if !c.isRunning {
//		return
//	}
//
//	log.Println("停止消息注册检查器")
//	close(c.stopCh)
//	c.isRunning = false
//}
//
//// IsRunning 检查是否正在运行
//func (c *MessageRegistrationChecker) IsRunning() bool {
//	c.mutex.RLock()
//	defer c.mutex.RUnlock()
//	return c.isRunning
//}
//
//// GetCurrentInterval 获取当前检查间隔
//func (c *MessageRegistrationChecker) GetCurrentInterval() time.Duration {
//	c.mutex.RLock()
//	defer c.mutex.RUnlock()
//	return c.currentInterval
//}
//
//// run 主运行循环
//func (c *MessageRegistrationChecker) run(ctx context.Context) {
//	defer func() {
//		c.mutex.Lock()
//		c.isRunning = false
//		c.mutex.Unlock()
//	}()
//
//	ticker := time.NewTicker(c.currentInterval)
//	defer ticker.Stop()
//
//	for {
//		select {
//		case <-ctx.Done():
//			log.Println("接收到上下文取消信号，退出消息注册检查")
//			return
//		case <-c.stopCh:
//			log.Println("接收到停止信号，退出消息注册检查")
//			return
//		case <-ticker.C:
//			c.performCheck()
//
//			// 更新ticker间隔
//			c.mutex.RLock()
//			newInterval := c.currentInterval
//			c.mutex.RUnlock()
//
//			ticker.Stop()
//			ticker = time.NewTicker(newInterval)
//		}
//	}
//}
//
//// performCheck 执行一次检查
//func (c *MessageRegistrationChecker) performCheck() {
//	log.Printf("开始检查消息注册状态，当前检查间隔: %v", c.GetCurrentInterval())
//
//	// 检查是否已注册
//	if c.checkRegistrationFunc() {
//		log.Println("消息客户端已完成注册")
//		c.handleRegistrationSuccess()
//		return
//	}
//
//	log.Println("消息客户端未完成注册，尝试重新注册")
//
//	// 调用消息注册函数
//	if c.registrationFunc() {
//		log.Println("消息注册成功")
//		c.handleRegistrationSuccess()
//	} else {
//		log.Println("消息注册失败")
//		c.handleRegistrationFailure()
//	}
//}
//
//// handleRegistrationSuccess 处理注册成功的情况
//func (c *MessageRegistrationChecker) handleRegistrationSuccess() {
//	c.mutex.Lock()
//	defer c.mutex.Unlock()
//
//	// 延长检查时间（乘以2）
//	newInterval := c.currentInterval * 2
//
//	// 如果超过最大间隔（一天），恢复到初始间隔（10秒）
//	if newInterval > c.maxInterval {
//		c.currentInterval = c.initialInterval
//		log.Printf("检查间隔超过最大值，恢复到初始间隔: %v", c.currentInterval)
//	} else {
//		c.currentInterval = newInterval
//		log.Printf("注册成功，延长检查间隔到: %v", c.currentInterval)
//	}
//}
//
//// handleRegistrationFailure 处理注册失败的情况
//func (c *MessageRegistrationChecker) handleRegistrationFailure() {
//	c.mutex.Lock()
//	defer c.mutex.Unlock()
//
//	// 缩短检查时间（除以2）
//	newInterval := c.currentInterval / 2
//
//	// 如果小于最小间隔（2秒），恢复到初始间隔（10秒）
//	if newInterval < c.minInterval {
//		c.currentInterval = c.initialInterval
//		log.Printf("检查间隔已达到最小值，恢复到初始间隔: %v", c.currentInterval)
//	} else {
//		c.currentInterval = newInterval
//		log.Printf("注册失败，缩短检查间隔到: %v", c.currentInterval)
//	}
//}
//
//// 示例使用方法
//
//// isRegistered 检查是否已注册（示例实现）
//func isRegistered() bool {
//	// 这里应该实现实际的注册状态检查逻辑
//	// 例如：检查连接状态、验证令牌等
//	log.Println("检查注册状态...")
//
//	// 示例：随机返回结果用于测试
//	// 实际使用时应该替换为真实的检查逻辑
//	return false // 为了演示，这里总是返回false
//}
//
//// MessInitReg01 消息注册函数（示例实现）
//func MessInitReg01() bool {
//	// 这里应该实现实际的消息注册逻辑
//	log.Println("执行消息注册...")
//
//	// 示例：模拟注册过程
//	time.Sleep(100 * time.Millisecond) // 模拟网络延迟
//
//	// 示例：随机返回结果用于测试
//	// 实际使用时应该替换为真实的注册逻辑
//	return false // 为了演示，这里总是返回false
//}
//
//// main 主函数示例
//func main() {
//	// 创建消息注册检查器
//	checker := NewMessageRegistrationChecker(isRegistered, MessInitReg01)
//
//	// 创建上下文
//	ctx, cancel := context.WithCancel(context.Background())
//	defer cancel()
//
//	// 启动检查器
//	checker.Start(ctx)
//
//	// 运行一段时间后停止（示例）
//	time.Sleep(2 * time.Minute)
//
//	// 停止检查器
//	checker.Stop()
//
//	fmt.Println("程序结束")
//}
